﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActionTrackerDAO.Base;
using ActionTrackerEntities;

namespace ActionTrackerDAO
{
    public class UsuarioDAO : DAOBase<Usuario, int>
    {
        public Usuario GetLogin(string pUserName, string pPassword)
        {
            Session.Clear();
            return Session.QueryOver<Usuario>()
                .Where(x => x.Nombre == pUserName)
                .And(x => x.Password == pPassword)
                .List().FirstOrDefault();
        }

        public Usuario GetPassword(string pUserName)
        {
            Session.Clear();
            return Session.QueryOver<Usuario>()
                .Where(x => x.Nombre == pUserName)
                .List().FirstOrDefault();
        }


        public bool ExisteUsuarioConNombre(string pUserName, int? pIdUsuarioEnEdicion)
        {
            if (pIdUsuarioEnEdicion.HasValue)
            {
                Session.Clear();
                //busco el usuario en la BD
                var oUsuarioEnEdicion = Session.QueryOver<Usuario>()
                .Where(x => x.IdUsuario == pIdUsuarioEnEdicion)
                .List().FirstOrDefault();

                //si el nombre que está en BD es igual al parámetro, no cambié el nombre de usuario
                if (oUsuarioEnEdicion.Nombre == pUserName)
                {
                    return false;
                }
            }
            
            var oQuery = Session.QueryOver<Usuario>()
            .Where(x => x.Nombre == pUserName)
            .List();
            if (oQuery.Count > 0)
            {
                return true;
            }
            return false;    
        }

        public List<Usuario> GetByFiltro(TipoUsuarioEnum? pTipoUsuario, int? pProyectoId, bool pSoloActivos)
        {
            var oQuery = Session.QueryOver<Usuario>();
            Session.Clear();
            if (pTipoUsuario.HasValue)
            {
                oQuery.Where(x => x.TipoUsuario == (int)pTipoUsuario);
                
            }
            if (pSoloActivos)
            {
                oQuery.Where(x => x.FechaBaja == null);
            }

            //TODO: mejorar esto!
            var listaUsuarios = (List<Usuario>)oQuery.OrderBy(x => x.Nombre).Asc.List();

            if (pProyectoId.HasValue)
            {
                List<Usuario> usuariosDelProyecto = new List<Usuario>();
                foreach (var usuario in listaUsuarios)
                {
                    if (usuario.Proyectos.Any())
                    {
                        foreach (var proyecto in usuario.Proyectos)
                        {
                            if (proyecto.IdProyecto == pProyectoId)
                            {
                                usuariosDelProyecto.Add(usuario);
                            }
                        }
                    }
                }
                return usuariosDelProyecto;
            }
            else
            {
                return listaUsuarios;
            }
        }
    }
}
